#ifndef _HEAD_H_
#define _HEAD_H_
#include <stdio.h>
#include <stdlib.h>
#include "cJSON.h"
#include "msg_queue_peer.h"
#include "shmem.h"
#include <string.h>
#include <pthread.h>
#include "MQTTClient.h"
#include <sqlite3.h>
#include <time.h>

#define ADDRESS "tcp://192.168.50.13:1883"
#define CLIENTID "ExampleClientSub"
#define TOPIC "down"
#define TOPIA "up"
#define PAYLOAD "Hello World!"
#define QOS 1
#define TIMEOUT 10000L
#define KB 1024
#define SIZE 115200

void *subscribe(); //mqtt接收
void *publish();   //mqtt发送
void write_shared();  //写创建共享内存写入
void connlost(void *context, char *cause);
int msgarrvd(void *context, char *topicName, int topicLen, MQTTClient_message *message);
void delivered(void *context, MQTTClient_deliveryToken dt);
void send_qt();//向qt发送数据

//mqtt
volatile MQTTClient_deliveryToken deliveredtoken;
int rc;
MQTTClient client;
MQTTClient_connectOptions conn_opts = MQTTClient_connectOptions_initializer;
MQTTClient_message pubmsg = MQTTClient_message_initializer;
MQTTClient_deliveryToken token;


static struct shm_param para;
static int *total;                //指向共享内存中数据节点总个数
static struct std_node *node_arr; //指向共享内存中节点缓存数组头


//全局变量
int lenth;  // 32数据个数
int lenth1;  //modbus数据个数
void *node_p=NULL;  //共享内存指针
char *ip; //ip
int port; //端口号
int type; //上报模式
int period; //上报周期
//控制设备全局变量
char name_k[32];//往哪个设备（32或者modbus）发控制指令
int key_k; //key值判断是控制哪个设备
int flag_k; //设备通断标志(0或者1)
int refresh = 0; //是否刷新标志位

//结构体
union val_t {
    int b_val;   //bool类型存储空间
    int i_val;   //整形值存储空间
    float f_val; //浮点值存储空间
};
//共享内存使用的结构体数组
struct std_node
{
    int key;             //唯一键值
    int type;            //数据点类型
    char dev_type[32];        //数据点属于哪个设备，根据网关支持的设备自行定义
    union val_t old_val; //变化上报后需要更新旧值
    union val_t new_val; //从共享内存取出最新数据，放到new_val中
    int ret;             //默认为-1，采集成功后设置为0，采集失败再置-1
};
//消息队列结构体
struct msgbuf
{
    long mtype;
    char name[32];  //往哪个设备（32或者modbus）发控制指令
    int key;  //key值判断是控制哪个设备
    int flag;  //设备通断标志
};
#endif